// 公共引入部分
const Koa = require('koa');
const Router = require('koa-router');
const static = require('./routers/static'); 
const session = require('koa-session');
const ejs = require('koa-ejs')
const config = require('./config');

// 小工具
const path = require('path')
const body = require('koa-better-body');
const fs = require('fs');

// 得到服务实例
let server = new Koa();

// 配置ejs渲染信息
ejs(server, {
    // 模板目录
    root:path.resolve(__dirname, './template'),
    layout:false,
    // 文件后缀
    viewExt:'ejs',
    // 是否缓存
    cache:false,
    // 编译之后的内容是否全部输出到控制台
    debug:false,
})

// 设置keys
server.keys = fs.readFileSync('./.keys').toString().split('\n');

// 接收post数据的中间件
server.use(body({
    // 指定接收文件上传路径
    uploadDir:config.UPLOAD_DIR
}))

// 配置session信息
server.use(session({
    maxAge: 20 * 60 * 1000,
    renew: true
}, server))

// 得到数据库实例
server.context.db = require('./libs/database')
// 得到公共配置实例
server.context.config = config;

// 总路由
let router = new Router();

// 路由的统一处理
router.use(async (ctx, next) => {
    try {
        await next();
        // 针对执行了路由但没有返回（也就是不存在的路由）
        if(!ctx.body){
            let {HTTP_ROOT} = ctx.config;
            await ctx.render('www/404',{
                HTTP_ROOT:ctx.config.HTTP_ROOT,
            })
        }
    } catch (e) {
        // ctx.status = 500
        // ctx.render = 'sorry Inter server error!'
        let {HTTP_ROOT} = ctx.config;
        await ctx.render('www/404',{
            HTTP_ROOT:ctx.config.HTTP_ROOT,
        })
        console.log(e)
    }
})

// 路由区块分配
    // 后台路由(管理员)
    router.use('/admin', require('./routers/admin'))
    // 前台路由
    router.use('', require('./routers/www'))
    // 请求api
    router.use('/api', require('./routers/api'))

// 分配请求的不同缓存时间
static(router, {
    // 配置缓存时间（单位：天）
    image: 10,
    script: 1,
    html: 10,
    order: 7
})

// 使用路由
server.use(router.routes());
// 监听端口
server.listen(config.ROPT);
// 打印运行信息
console.log(`server running at ${config.ROPT}`)